from lxml import etree

# nodename	选取此节点的所有子节点。
# /	从根节点选取。
# //	从匹配选择的当前节点选择文档中的节点，而不考虑它们的位置。
# .	选取当前节点。
# ..	选取当前节点的父节点。
# @	选取属性。
html="""
<!DOCTYPE html>
<html>
<head lang="en">
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div id="content">
<ul id="ul">
<li>NO.1</li>
<li>NO.2</li>
<li>NO.3</li>
</ul>
<ul id="ul2">
<li>one</li>
<li>two</li>
</ul>
</div>
<div id="url">
<a href="http://www.58.com" title="58">58</a>
<a href="http://www.csdn.net" title="CSDN">CSDN</a>
</div>
</body>
</html>
"""
selector = etree.HTML(html)
href = selector.xpath('//a/@href')  # @获取标签属性中的内容
print(href)
content=selector.xpath('//div[@id="content"]/ul[@id="ul"]/li/text()') # id属性定位
print(content)
# starts-with提取标签属性开头为。。。的特定标签，感觉没什么卵用
# 特殊情况可以用text()=标签中内容来提取指定标签
# 列如：可以用div[text()='hello']提取
html="""
    <div>hello
        <p>H</p>
</div>
<div>hehe</div>
"""

# 通配符
# *	匹配任何元素节点。如：/   /*提取   中所有子元素
# @*	匹配任何属性节点。  就是指其中元素要有属性就能匹配上   ‘/div[@*]’  选取所有带属性的div节点
# node()	匹配任何类型的节点。
# |代表和，可以用来选取一个标签下的多个标签